// Package database
// @File: dsn.go
// @Description:
// @Author: YaoRuiQi
// @Date: 2025/8/25 16:05

package database

import (
	"GinStandardTemplate/internal/constant"
	"fmt"
)

// DSNConfig
// @Description: 数据源配置
type DSNConfig struct {
	Dialect  string // 数据库类型：mysql | postgres | sqlite
	Host     string // 数据库地址
	Port     int    // 端口号
	User     string // 用户名
	Password string // 密码
	DBName   string // 数据库名

	// 特定数据库参数
	Charset    string // MySQL 专用，例如 utf8mb4
	SSLMode    string // Postgres 专用：disable / require
	TimeZone   string // Postgres 专用，建议 Asia/Shanghai
	SQLiteFile string // SQLite 文件路径
}

// BuildDSN
//
//	@Description: 构建数据库连接字符串
func BuildDSN(cfg DSNConfig) (string, error) {
	switch cfg.Dialect {
	case constant.DatabaseDialectMySQL:
		if cfg.Charset == "" {
			cfg.Charset = "utf8mb4"
		}
		return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
			cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Charset,
		), nil

	case constant.DatabaseDialectPostgres:
		if cfg.SSLMode == "" {
			cfg.SSLMode = "disable"
		}
		if cfg.TimeZone == "" {
			cfg.TimeZone = "Asia/Shanghai"
		}
		return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=%s",
			cfg.Host, cfg.Port, cfg.User, cfg.Password, cfg.DBName, cfg.SSLMode, cfg.TimeZone,
		), nil

	case constant.DatabaseDialectSQLite:
		if cfg.SQLiteFile == "" {
			return "", fmt.Errorf("sqlite 文件路径不能为空")
		}
		return cfg.SQLiteFile, nil

	default:
		return "", fmt.Errorf("不支持的数据库类型: %s", cfg.Dialect)
	}
}
